import { Logger } from '@/utils/logger';
import { TaskBase } from '../TaskBase';

const MIN_TIME_FOR_BOOST = 0.7;

/**
 * 任务：使用目标 lab 中的资源给自己 boost
 * 
 * 由于实战中出现过由于供给不足而导致 creep 白白 boost 了一半然后
 * 自然死亡导致 boost t3 资源的浪费，所以这里设置一个阈值，超过这个
 * 值的爬将强制结束 boost
 * 
 * data = { rType使用哪种资源 amount要boost多少部件 }
 */
export class TaskGetBoosted extends TaskBase {
    shouldRun(creep: Creep): boolean {
        return !this.checkTTL(creep) &&     // TTL 足够
            'structureType' in this.target &&
            this.target.structureType === STRUCTURE_LAB &&  // 是 lab
            (<StructureLab>this.target).mineralType === this.taskData.rType;
        // 化合物种类相同
    }
    _run(creep: Creep) {
        const lab = <StructureLab>this.target;
        // 在等到足够的资源前啥也不干
        if (
            lab.store[lab.mineralType] < LAB_BOOST_MINERAL * this.taskData.amount ||
            lab.store.energy < LAB_BOOST_ENERGY * this.taskData.amount
        ) {
            return ERR_UNFINISHED;
        }
        // 执行 boost 操作
        const result = lab.boostCreep(creep, this.taskData.amount);
        if (result === OK) {
            creep.say('✔️');
            return OK;
        }
        else if (result === ERR_NOT_IN_RANGE) {
            return ERR_NOT_IN_RANGE;
        }
        else if (result === ERR_NOT_FOUND) {
            // lab 中不存在能 boost 该 creep 的资源
            creep.say('✖️没有资源');
            Logger.warn(`${creep.mark} 无法使用 ${this.target} 进行 boost 操作，因为没有能够 boost 的资源`, 'task');
            return OK;
        }
        else if (result === ERR_NOT_ENOUGH_RESOURCES) {
            // 等待资源
            return ERR_UNFINISHED;
        }
        else {
            return OK;
        }
    }

    private checkTTL(creep: Creep) {
        const isClaim = creep.body.some(bp => bp.type === CLAIM);
        const lifetime = isClaim ? CREEP_CLAIM_LIFE_TIME : CREEP_LIFE_TIME;
        // 为了兼容写了 claim 的爬，阈值分别是 420t 和 1050t。
        return creep.ticksToLive && creep.ticksToLive < MIN_TIME_FOR_BOOST * lifetime;
    }
}